package while_lang.semantics;

/** Representación de una variable, definida por su identificador, su tipo y
 *  opcionalmente su valor actual.
 *  @author Leonardo Val.
 */
public class Variable {
	public final String id;
	public final Type type;
	private Object __value__;
	
	public Variable(String id, Type type) {
		this(id, type, null);
	}
	
	public Variable(String id, Type type, Object value) {
		this.id = id;
		this.type = type;
		if (value != null) {
			assign(value);
		}
	}
	
	public Object value() {
		if (__value__ == null) {
			throw new Error("Variable "+ id +" no tiene un valor definido.");
		} else {
			return __value__;
		}
	}
	
	public Object assign(Object value) {
		if (type.isCompatible(value)) {
			__value__ = type.coerce(value);
			return __value__;
		} else {
			throw new Error("Tipos incompatibles: el valor "+ value +
				" no se puede asignar a "+ type.unparse() +" "+ id +".");
		}
	}

	@Override public String toString() {
		return type.unparse() +" "+ id +" = "+ __value__;
	}	
	
}
